package br.ufpb.di.ppgi.apresentacao.controllers;

import java.io.File;
import java.util.Date;
import java.util.List;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.download.Download;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.validator.Hibernate;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.view.Results;
import br.com.simtecnologia.access.controll.annotation.ControlledResource;
import br.com.simtecnologia.access.controll.role.Roles;
import br.ufpb.di.ppgi.apresentacao.SiteConfiguration;
import br.ufpb.di.ppgi.negocio.ServiceLocator;
import br.ufpb.di.ppgi.negocio.iservicos.IPropostaService;
import br.ufpb.di.ppgi.negocio.modelo.homologacao.proposta.HomologacaoProposta;
import br.ufpb.di.ppgi.negocio.modelo.proposta.Proposta;
import br.ufpb.di.ppgi.negocio.modelo.usuario.Usuario;
import br.ufpb.di.ppgi.negocio.modelo.usuario.UsuarioSessionInfo;
import br.ufpb.di.ppgi.persistencia.transaction.TransactionScoped;
import br.ufpb.di.ppgi.util.PdfUtil;

@Path("/admin/propostas/")
@ControlledResource
@Roles({"PROFESSOR"})
public class PropostasRestrictController extends AbstractController {
	
	private final IPropostaService servico;
	private final ServiceLocator serviceLocator;
    private final UsuarioSessionInfo usuarioInfo;
    private final SiteConfiguration conf;
    private final PdfUtil pdfUtil;
	

	public PropostasRestrictController(Result result, Validator validator,
			ServiceLocator services, UsuarioSessionInfo usuarioInfo, SiteConfiguration conf, PdfUtil pdfUtil) {
		super(result, validator, services);

		this.usuarioInfo = usuarioInfo;
		this.serviceLocator = services;
		this.servico = services.forProposta();
		this.conf = conf;
		this.pdfUtil = pdfUtil;
	}
	
	@Get
	@Path({"editar-{id}",""})
	public void index(Long id) {
		List<Usuario> professores = serviceLocator.forUsuario().listarProfessores();
		professores.remove(usuarioInfo.getUsuario());
		
		result.include("proposta", id == null ? null : servico.buscar(id));
		result.include("alunos", serviceLocator.forAluno().listarMeusOrientandosQuePodemEnviarProposta(usuarioInfo.getId()));
		result.include("professores", professores);
		
	}
	
	@Post
	@Path("enviar")
	@TransactionScoped
	public void enviarProposta(Proposta proposta, String hora, String minuto, UploadedFile anexo) {
		if (proposta == null) {
			validator.add(new ValidationMessage("Proposta nula.", "erro"));
			validator.onErrorUse(Results.page()).of(getClass()).index(null);
			return;
		} 
		
		proposta.updateHoraMinuto(Integer.valueOf(hora),Integer.valueOf(minuto));

		Date dataProposta = proposta.getData_proposta();
		if (dataProposta.before(new Date())){
			validator.add(new ValidationMessage("Nao é possível agendar uma proposta para uma data no passado.", "erro"));
			validator.onErrorUse(Results.page()).of(getClass()).index(null);
			return;
		}
			
		proposta.saveAnexo(anexo, conf.getAnexosDirPath());
		
		validator.addAll(Hibernate.validate(proposta));
		validator.onErrorUse(Results.page()).of(getClass()).index(null);
		
		if (proposta.getId() != null)
			servico.atualizar(proposta);
		else
			servico.adicionar(proposta);
		
		result.redirectTo(ProcessosRestrictController.class).index("Proposta de dissertação encaminhada para homologação.");
	}
	
	@Path("pdf/{id}")
	@Roles({"COLEGIADO"})
	public Download pdf(Long id) {
		Proposta proposta = services.forProposta().buscar(id);
		
		File file = new File(proposta.getFile_path());
		
		if (!file.exists())
			result.use(Results.status()).notFound();
		
		return pdfUtil.downloadPdf(proposta.getFile_path(), id+".pdf");
	}
	
	@Path("{id}")
	@Roles({"COLEGIADO","SECRETARIO"})
	public void detalhes(Long id) {
		Proposta proposta = services.forProposta().buscar(id);
		
		result.include("proposta", proposta);
	}
	
	@Path("{homologacao.pk.proposta.id}/homologar-{homologado}")
	@Roles({"COLEGIADO"})
	@TransactionScoped
	public void homologar(HomologacaoProposta homologacao, Boolean homologado) {
		homologacao.getPk().setColegiado(usuarioInfo.getUsuario());
		
		homologado = services.forProposta().homologar(homologacao,homologado);
		
		result.include("homologado",homologado);
		result.redirectTo(PendenciasRestrictController.class).index();
	}
	
//	@Path("acompanhamento")
//	@Roles({"COORDENADOR"})
//	public void acompanhamento() {
//		result.include("propostas",servico.listar());
//	}
	
	@Path("{proposta.id}/aprovar-{aprovado}")
	@Roles({"COORDENADOR"})
	@TransactionScoped
	public void aprovar(Proposta proposta, Boolean aprovado) {
		try {
			aprovado = services.forProposta().aprovar(proposta,aprovado);
			
			result.include("aprovado_proposta",aprovado);
			result.redirectTo(AcompanhamentosRestrictController.class).index();
		} catch (Exception e) {
			result.include("aprovado_proposta",false);
			validator.add(new ValidationMessage("Proposta nao homologada", "error"));
			validator.onErrorUse(Results.logic()).redirectTo(AcompanhamentosRestrictController.class).index();
		}
	}	
	
}